<?php

namespace System\Configure\Adapter;


namespace System\Configure\Adapter;

use System\Configure\AdapterAbstract;
use System\Configure\Exception\ParserJsonException;

/**
 * JSON配置文件解析类
 *
 * @package Dream
 * @subpackage Json
 * @namespace System\Configure\Adapter
 * @author lewis (lewisld@yeah.net)
 */
class Json extends AdapterAbstract
{

    /**
     * JSON配置文件解析后的数组
     *
     * @static
     * @access protected
     * @var array
     */
    protected static $data = [];

    /**
     * 解析JSON配置文件到数组
     *
     * @static
     * @access public
     * @param string $path JSON配置文件路径
     * @return array 返回JSON配置项数组
     * @throws ParseJsonException 解析JSON配置文件到数组异常
     */
    public static function parser($path)
    {
        self::$data = json_decode(file_get_contents($path), true);
        if (json_last_error() !== JSON_ERROR_NONE) {
            $error = array(
                'message' => self::getJsonErrorMsg(),
                'type' => json_last_error(),
                'file' => $path,
                'jsonfile' => $path
            );
            throw new ParserJsonException($error);
        }
        unset($error);
        return self::$data;
    }

    /**
     * 获取JSON配置文件解析的错误消息
     *
     * @static
     * @access protected
     * @return string 返回JSON配置文件解析的错误消息语言键名
     */
    protected static function getJsonErrorMsg()
    {
        switch (json_last_error()) {
            default:
                return 'system.error.conf.parser.json';
                break;
            case JSON_ERROR_DEPTH:
                return 'system..error.conf.parser.json';
                break;
            case JSON_ERROR_STATE_MISMATCH:
               return 'system..error.conf.parser.json.state.mismatch';
                break;
            case JSON_ERROR_CTRL_CHAR:
                return 'system..error.conf.parser.json.ctrl.char';
                break;
            case JSON_ERROR_SYNTAX:
                return 'system..error.conf.parser.json.syntax';
                break;
            case JSON_ERROR_DEPTH:
                return 'system..error.conf.parser.json.encode';
                break;
        }
    }
}